<?php

namespace App\Services\BaiduSpeech;


/**
 * 百度AI语音识别
 * @package App\Services
 */
class BaiduSpeechService
{
    /**
     * 百度语音识别接口
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */

    public function identify($filename)
    {
        /**
         * 第一部分，获取鉴权信息
         */

        $API_KEY = config('baiduspeech.API_KEY');

        $SECRET_KEY = config('baiduspeech.SECRET_KEY');
        $auth_url = "http://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=".$API_KEY."&client_secret=".$SECRET_KEY;
//        向鉴权url发送post请求
        $client = new \GuzzleHttp\Client();
        $response = $client->request('POST', $auth_url);
        $content = $response->getBody()->getContents();
        //获取到鉴权access_token
        $access_token = json_decode($content, true);

        /**
         * 第二部分，执行语音识别
         */
# 需要识别的文件
        $AUDIO_FILE = public_path('voice/'.$filename);
# 文件格式

        $FORMAT = substr($AUDIO_FILE, -3); // 文件后缀 pcm/wav/amr 格式 极速版额外支持m4a 格式

        $CUID = "123456PHP";
# 采样率
        $RATE = 16000;  // 固定值

# 普通版
        $ASR_URL = "http://vop.baidu.com/server_api";
# 根据文档填写PID，选择语言及识别模型
        $DEV_PID = 1837; //  1537  表示识别普通话，使用输入法模型。1837 	四川话
        $SCOPE = 'audio_voice_assistant_get'; // 有此scope表示有语音识别普通版能力，没有请在网页里开通语音识别能力

        $SCOPE = false; // 部分历史应用没有加入scope，设为false忽略检查
        //请求百度语音是别url
        $baiduUrl = $ASR_URL.'dev_pid='.$DEV_PID."&cuid=".$CUID."&token=".$access_token['access_token'];

        $client = new \GuzzleHttp\Client();
        $headers = [
            'Content-Type' => 'application/json',
            'Content-Length' => filesize($AUDIO_FILE),
        ];

        $response = $client->post($baiduUrl, [
            'headers' => $headers,
            'body' => json_encode([
                    'format' => $FORMAT,
                    'rate' => $RATE,
                    'token' => $access_token['access_token'],
                    'cuid' => $CUID,
                    'channel' => 1,
                    'speech' => base64_encode(file_get_contents($AUDIO_FILE)),
                    'len' => filesize($AUDIO_FILE)
                ]
            )
        ]);
        $content = $response->getBody()->getContents();
        $result = json_decode($content, true);
        return $result;
    }
}
